package repositorio;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import dados.Amostra;
import dados.Enfermeira;
import dados.Paciente;
import dados.Resultado;

public class RepositorioAmostra extends SentencasBD{
	
	public RepositorioAmostra(ConexaoBD conexao){
		super(conexao, 1, 1, 2, 2);
		
		this.cadastro[0] = "INSERT INTO tb_amostra (id, integridade, data, paciente, enfermeira, tipo) VALUES (?, ?, ?, " +
						   "(SELECT REF(P) FROM tb_paciente P WHERE P.id =  ?), (SELECT REF(E) FROM tb_enfermeira E WHERE E.id =  ?), ";
		this.remocao[0] = "DELETE FROM tb_amostra WHERE id = ?";
		this.atualizacao[0] = "UPDATE tb_amostra SET integridade = ?, data = ?, " +
							  "paciente = (SELECT REF(P) FROM tb_paciente P WHERE P.id =  ?), " +
							  "enfermeira = (SELECT REF(E) FROM tb_enfermeira E WHERE E.id =  ?), " +
							  "resultado = (SELECT REF(R) FROM tb_resultado R WHERE R.id =  ?), tipo = ";
		this.consulta[0] = "SELECT * FROM tb_amostra A WHERE A.id = ?";
		this.consulta[1] = "SELECT A.id, A.integridade, A.data, A.tipo FROM tb_amostra A";
	}
	
	public void inserir(Amostra amostra) throws SQLException{
		Connection c = this.conexao.getConexao();
		String varray = "tp_varray_tipo(";
		for(int i = 0; i < amostra.getTipos().size(); i++){
			varray += "'" + amostra.getTipos().get(i) + "'";
			if(i != amostra.getTipos().size()-1)
				varray += ",";
		}
		varray += "))";		
		PreparedStatement ps = c.prepareStatement(this.cadastro[0] + varray);
		//System.out.println(this.cadastro[0] + varray);
		ps.setInt(1, amostra.getId());
		ps.setString(2, amostra.getIntegridade());
		ps.setDate(3, amostra.getData());
		ps.setInt(4, amostra.getPaciente().getId());
		ps.setInt(5, amostra.getEnfermeira().getId());
		
		ps.executeUpdate();
		ps.close();
		c.close();
	}
	
	public void remover(int id) throws SQLException{		
		Connection c = this.conexao.getConexao();
		PreparedStatement ps = c.prepareStatement(this.remocao[0]);
		ps.setInt(1, id);
		
		ps.executeUpdate();
		ps.close();
		c.close();
	}
	
	public void editar(Amostra amostra) throws SQLException{
		Connection c = this.conexao.getConexao();
		String varray = "tp_varray_tipo(";
		for(int i = 0; i < amostra.getTipos().size(); i++){
			varray += "'" + amostra.getTipos().get(i) + "'";
			if(i != amostra.getTipos().size()-1)
				varray += ",";
		}
		varray += ")";		
		System.out.println(this.atualizacao[0] + varray + " WHERE id = ?");
		PreparedStatement ps = c.prepareStatement(this.atualizacao[0] + varray + "WHERE id = ?");
		ps.setString(1, amostra.getIntegridade());
		ps.setDate(2, amostra.getData());
		ps.setInt(3, amostra.getPaciente().getId());
		ps.setInt(4, amostra.getEnfermeira().getId());
		ps.setInt(5, amostra.getResultado().getId());
		ps.setInt(6, amostra.getId());
		
		ps.executeUpdate();
		ps.close();
		c.close();
	}
	
	private Enfermeira pegarEnfermeira(int id) throws SQLException{
		String sql = "SELECT DEREF(C.enfermeira).id, DEREF(C.enfermeira).nome, DEREF(C.enfermeira).rg, " +
					 "DEREF(C.enfermeira).cpf, DEREF(C.enfermeira).coren FROM tb_amostra C WHERE C.id = ?";
		PreparedStatement ps = conexao.getConexao().prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Enfermeira ret = null;
		if(set.next())
			ret = new Enfermeira(set.getInt(1), set.getString(2), set.getLong(3), set.getLong(4), set.getLong(5));
		
		return ret;
	}
	
	private Paciente pegarPaciente(int id) throws SQLException{
		String sql = "SELECT DEREF(C.paciente).id, DEREF(C.paciente).nome, DEREF(C.paciente).rg, " +
					 "DEREF(C.paciente).cpf, DEREF(C.paciente).convenio FROM tb_amostra C WHERE C.id = ?";
		PreparedStatement ps = conexao.getConexao().prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Paciente ret = null;
		if(set.next())
			ret = new Paciente(set.getInt(1), set.getString(2), set.getLong(3), set.getLong(4), set.getString(5));
		
		return ret;
	}
	
	private Resultado pegarResultado(int id) throws SQLException{
		String sql = "SELECT DEREF(C.resultado).id, DEREF(C.resultado).obs, DEREF(C.resultado).data, " +
					 "DEREF(C.resultado).descricao FROM tb_amostra C WHERE C.id = ?";
		PreparedStatement ps = conexao.getConexao().prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Resultado ret = null;
		if(set.next())
			ret = new Resultado(set.getInt(1), set.getString(2), set.getDate(3), set.getString(4));
		
		return ret;
	}
	
	public Amostra buscar(int id) throws SQLException{
		PreparedStatement ps = conexao.getConexao().prepareStatement(consulta[0]);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Amostra temp = null;
		if(set.next()){
			ResultSet varray = set.getArray("tipo").getResultSet();
			List<String> tipos = new ArrayList<String>();
			while(varray.next()){
				tipos.add(varray.getString(2));
			}
			
			temp = new Amostra(set.getInt(1), set.getString(2), set.getDate("data"), tipos); 
			//System.out.println(">> passou");
			temp.setEnfermeira(this.pegarEnfermeira(id));
			//System.out.println(">> passou2");
			temp.setPaciente(this.pegarPaciente(id));
			//System.out.println(">> passou3");
			temp.setResultado(this.pegarResultado(id));
		}
		return temp;
	}
	
	public Iterator<Amostra> iterator() throws SQLException{
		PreparedStatement ps = conexao.getConexao().prepareStatement(consulta[1]);
		ResultSet set = ps.executeQuery();
		List<Amostra> all = new ArrayList<Amostra>();
		while(set.next()){
			ResultSet varray = set.getArray("tipo").getResultSet();
			List<String> tipos = new ArrayList<String>();
			while(varray.next()){
				tipos.add(varray.getString(2));
			}
			
			all.add(new Amostra(set.getInt(1), set.getString(2), set.getDate("data"), tipos));
		}
		return all.iterator();
	}
	
	/*
	public static void main(String[] args) {
		try {
			ConexaoBD c = new ConexaoBD("oracle.jdbc.driver.OracleDriver",
					"jdbc:oracle:thin:@itapissuma.cin.ufpe.br:1521:dbdisc", 
					"g101if685_eq02", "equipe2gdi");
			System.out.println("passou daqui 1");
			RepositorioAmostra r = new RepositorioAmostra(c);
			List<String> tipo = new ArrayList<String>();
			tipo.add("tipo1"); tipo.add("tipo2");
			Amostra a = new Amostra(555, "integridade1", new Date(4697), tipo, new Paciente(11), new Enfermeira(12125));
			r.inserir(a);
			System.out.println("INSERIU");
			Amostra teste = r.buscar(555);
			System.out.println("BUSCOU");
			System.out.println("- Tipos da amostra buscada:");
			for(String e : teste.getTipos()) System.out.println("   " + e);
			System.out.println("- Paciente da amostra buscada: " + teste.getPaciente().getId() + "-" + teste.getPaciente().getNome());
			System.out.println("- Enfermeira da  amostra buscada: " + teste.getEnfermeira().getId() + "-" + teste.getEnfermeira().getNome());
			System.out.println();
			a.setResultado(new Resultado(4545));
			r.editar(a);
			System.out.println("MANDOU ATUALIZAR");
			teste = r.buscar(555);
			System.out.println("- Tipos da amostra atualizada:");
			for(String e : teste.getTipos()) System.out.println("   " + e);
			System.out.println("- Paciente da amostra atualizada: " + teste.getPaciente().getId() + "-" + teste.getPaciente().getNome());
			System.out.println("- Enfermeira da  amostra atualizada: " + teste.getEnfermeira().getId() + "-" + teste.getEnfermeira().getNome());
			System.out.println("- Resultado da amostra atualizada: " + teste.getResultado().getId() + "-" + teste.getResultado().getObservacao());
			
			Iterator<Amostra> it = r.iterator();
			if(it.hasNext()) System.out.println(" " + it.next().getId());
		} catch (ClassNotFoundException e) {
			System.out.println(">> erro1");
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println(">> erro2");
			e.printStackTrace();
		}
	}*/
}
